package com.JUC;

import java.util.concurrent.*;

public class JUC11_MyThreadPoolExecutor {
    // 任务队列的参数如果不写就默认为 Integer.MAX_VALUE,所以需要写上
    // 线程工厂使用默认的，模仿源码
    // 拒绝策略也暂时使用和默认的
    // 线程池的最多可以容纳 最大线程数 + 任务队列可容纳数
    // 超出会报 RejectedExecutionException
    public static void main(String[] args) {
        // 获取电脑的 CPU 核数
        int CPU = Runtime.getRuntime().availableProcessors();
        int maximumPoolSize = CPU + 1;

        ExecutorService threadpool = new ThreadPoolExecutor(2,
                                                            maximumPoolSize,
                                                            2L,
                                                            TimeUnit.SECONDS,
                                                            new LinkedBlockingQueue<>(3),
                                                            Executors.defaultThreadFactory(),
                                                            new ThreadPoolExecutor.AbortPolicy());

        try {
            //模拟有 N 个顾客来办理业务
            for (int i = 1; i <= 13; i++) {
                threadpool.execute(()->{
                    System.out.println("当前\t"+ Thread.currentThread().getName()+"\t办理业务");
                });
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadpool.shutdown();
        }
    }
}
